//// IMPORTANT NOTICE (Fab Academy 2020 / Laru //// This code is a remix of following projects done by others: /// 1. https://randomnerdtutorials.com/esp8266-and-node-red-with-mqtt/ (how to use MQTT and Nodered, but NOT how to use DIT sensor, because i didn't have that component) /// 2. https://lastminuteengineers.com/bme280-esp8266-weather-station/ (to learn how to use BME sensor, because I didn't have DIT sensor) /// Libraries that I used to use BME sensor didn't have function to compute heatindex, so I have disabled it from this code below. #include #include #include #include #include //define adafruit bme820 sensor Adafruit_BME280 bme; // // Change the credentials below, so your ESP8266 connects to your router const char* ssid = "ubinotko1"; const char* password = ""; // Change the variable to your Raspberry Pi IP address, so it connects to your MQTT broker const char* mqtt_server = "192.168.100.47"; // Initializes the espClient. You should change the espClient name if you have multiple ESPs running in your home automation system WiFiClient espClient; PubSubClient client(espClient); // Lamp - define port to be used const int lamp = 2; // Timers auxiliar variables long now = millis(); long lastMeasure = 0; // Don't change the function below. This functions connects your ESP8266 to your router void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("WiFi connected - ESP IP address: "); Serial.println(WiFi.localIP()); } // This functions is executed when some device publishes a message to a topic that your ESP8266 is subscribed to // Change the function below to add logic to your program, so when a device publishes a message to a topic that // your ESP8266 is subscribed you can actually do something void callback(String topic, byte* message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); // Feel free to add more if statements to control more GPIOs with MQTT // If a message is received on the topic room/lamp, you check if the message is either on or off. Turns the lamp GPIO according to the message if(topic=="room/lamp"){ Serial.print("Changing Room lamp to "); if(messageTemp == "on"){ digitalWrite(lamp, HIGH); Serial.print("On"); } else if(messageTemp == "off"){ digitalWrite(lamp, LOW); Serial.print("Off"); } } Serial.println(); } // This functions reconnects your ESP8266 to your MQTT broker // Change the function below if you want to subscribe to more topics with your ESP8266 void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect /* YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU'RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS To change the ESP device ID, you will have to give a new name to the ESP8266. Here's how it looks: if (client.connect("ESP8266Client")) { You can do it like this: if (client.connect("ESP1_Office")) { Then, for the other ESP: if (client.connect("ESP2_Garage")) { That should solve your MQTT multiple connections problem */ if (client.connect("ESP8266Client")) { Serial.println("connected"); // Subscribe or resubscribe to a topic // You can subscribe to more topics (to control more LEDs in this example) client.subscribe("room/lamp"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } // The setup function sets your ESP GPIOs to Outputs, starts the serial communication at a baud rate of 115200 // Sets your mqtt broker and sets the callback function // The callback function is what receives messages and actually controls the LEDs void setup() { pinMode(lamp, OUTPUT); //let's tell BME's I2C adress bme.begin(0x76); Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } // For this project, you don't need to change anything in the loop function. Basically it ensures that you ESP is connected to your broker void loop() { if (!client.connected()) { reconnect(); } if(!client.loop()) client.connect("ESP8266Client"); now = millis(); // Publishes new temperature and humidity every 30 seconds if (now - lastMeasure > 30000) { lastMeasure = now; // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = bme.readHumidity(); // Read temperature as Celsius (the default) float t = bme.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) // float f = bme.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) ) { Serial.println("Failed to read from DHT sensor!"); return; } // Computes temperature values in Celsius // float hic = bme.computeHeatIndex(t, h, false); static char temperatureTemp[7]; dtostrf(t, 6, 2, temperatureTemp); // Uncomment to compute temperature values in Fahrenheit // float hif = dht.computeHeatIndex(f, h); // static char temperatureTemp[7]; // dtostrf(hic, 6, 2, temperatureTemp); static char humidityTemp[7]; dtostrf(h, 6, 2, humidityTemp); // Publishes Temperature and Humidity values client.publish("room/temperature", temperatureTemp); client.publish("room/humidity", humidityTemp); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t Temperature: "); Serial.print(t); Serial.print(" *C "); // Serial.print(f); Serial.print(" *F\t Heat index: "); // Serial.print(hic); Serial.println(" *C "); // Serial.print(hif); // Serial.println(" *F"); } }